package cn.bonoon.kernel.annotations;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import cn.bonoon.kernel.io.DirectoryStrategy;
import cn.bonoon.kernel.io.FilenameStrategy;

/**
 * <pre>
 * 使用本注解，可以自动保存由客户端上传上来的文件的信息
 * 
 * 框架上传文件是使用{@link cn.bonoon.kernel.io.FileManager FileManager}文件管理接口进行文件的上传下载管理的
 * 
 * 文件的上传所需要的字段分析：
 * 1. 上传的路径  修改的时候需要，可以点击下载该文件或在线打开图片
 * 2. 上传的文件对象  提交表单的时候需要有一个对象可以把文件封装起来
 * 3. 删除指示  修改的时候，如果没有选择一个文件对象上传，这个情况下该文件是不变呢还是需要删除
 * 
 * 
 * </pre>
 * @author jackson
 *
 */
@Target(FIELD)
@Retention(RUNTIME)
public @interface TransformFile {
	
	/**
	 * <pre>
	 * 该文件上传后存放的目录；
	 * 对保存的时候有用，读取的时候是直接通过已经存储的路径来读取文件，不再需要通过目录去组织路径的
	 * </pre>
	 * 
	 * @return
	 */
	String directory() default "";
	
	/**
	 * 保存文件所使用的策略
	 * @return
	 */
	DirectoryStrategy directoryStrategy() default DirectoryStrategy.NONE;
	
	/**
	 * 文件名
	 * @return
	 */
	FilenameStrategy filenameStrategy() default FilenameStrategy.NONE;
	
	/**
	 * <pre>
	 * 指定被写入的实体，哪一个字段用于存放该文件的大小的
	 * 如：<code>propertySize="size"</code>
	 * 即把上传后的文件的大小写入实体的size字段
	 * </pre>
	 * @return
	 */
	String propertySize() default "";
	
	/**
	 * 文件名写入的字段
	 * @return
	 */
	String propertyFilename() default "";
	
	/**
	 * 上传上来的附件的源来的名称
	 * @return
	 */
	String propertyOriginalName() default "";
	
	/**
	 * 文件后缀写入的字段
	 * @return
	 */
	String propertyFilesuffix() default "";
	
	/**
	 * 修改的时候，如果上传新的文件，是否需要把旧的删除掉
	 * @return
	 */
	boolean deleteOldFile() default false;
	
	/**
	 * 可以指定一个文件管理器的对象来处理这里的文件，如果没有指定，则使用名为"fileManager"的管理器，所以系统必须要提供名为"fileManager"的文件管理器
	 * @return
	 */
	String fileManager() default "fileManager";
	
	String suffixComponent() default "-file";
	
	String suffixDeletable() default "-deleted";
	
	/**
	 * <pre>
	 * 上传附件大小的最大限制；
	 * 0表示不限制
	 * 单位为B
	 * 即：1KB=1024B
	 * 1MB=1024KB
	 * </pre>
	 * @return
	 */
	int maxUploadSize() default 0;
	
	/**
	 * 对上传文件的后缀名的限制，如：.exe/.jpg等后缀名
	 * @return
	 */
	String[] restrictions() default {};
}
